package main

import "fmt"

func main() {
	//切片的定义
	var s1 []int
	var s2 []string
	fmt.Println(s1, s2)
	//初始化、
	s1 = []int{1, 2, 3}
	s2 = []string{"a", "b", "c"}
	fmt.Println(s1, s2)
	//切片的长度和容量
	fmt.Println(len(s1), cap(s1))
	fmt.Println(len(s2), cap(s2))
	//数组得到切片
	arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	s3 := arr[2:7] //左包含右不包含
	fmt.Println(s3)
	s4 := arr[:6] //没写就是从0开始
	fmt.Println(s4)
	s5 := arr[3:] //[3:len(arr)]
	fmt.Println(s5)
	s6 := arr[:] //[0:len(arr)]
	fmt.Println(s6)
	//切片的切片
	s7 := s4[2:5]
	fmt.Println(s7)
	//make 函数创造切片
	s8 := make([]int, 3, 5)
	fmt.Println(len(s8), cap(s8))
	s9 := make([]int, 0, 5)
	fmt.Println(len(s9), cap(s9))
	//切片的遍历
	for _, v := range s3 {
		fmt.Println(v)
	}
	//切片追加元素
	a1 := []string{"a", "b", "c"}
	fmt.Println(len(a1), cap(a1))
	a1 = append(a1, "d") //调用append函数必须用原来的切片变量接收返回值
	//append追加，原来底层数组放不下时，golang会重新分配一个更大的底层数组
	//然后把原来的元素拷贝到新的数组中，并返回新的切片
	fmt.Println(a1)
	fmt.Println(len(a1), cap(a1))
	a2 := a1
	var a3 = make([]string, 3, 3)
	copy(a3, a1) //copy 不拷贝地址
	fmt.Println(a1, a2, a3)
	a1[0] = "张三"
	fmt.Println(a1, a2, a3)

	//删除切片中的元素
	slice := []int{1, 2, 3, 4, 5}
	fmt.Println("原始切片:", slice) // 原始切片: [1 2 3 4 5]

	// 遍历切片，找到要删除的元素
	for i, v := range slice {
		if v == 3 {
			// 将删除元素后的切片切片拼接起来
			slice = append(slice[:i], slice[i+1:]...)
			break
		}
	}

	fmt.Println("删除元素后的切片:", slice) // 删除元素后的切片: [1 2 4 5]

}
